Suggested Citation:

Mendez C. (2020). Making maps in R: Using the sf and tmap Packages. R Studio/RPubs. Available at https://rpubs.com/quarcs-lab/tutorial-maps-in-r

This work is licensed under the Creative Commons Attribution-Share Alike 4.0 International License.

2 Tutorial objectives

  • Load spatial data files into R
  • Join non-spaital data to spatial data files
  • Create simple choropleth maps

3 Orginal data sources

The non-spatial datafile is from:

The spatial (shapefile) is from:

4 Import the data

4.1 Non-spatial data

4.1.1 Explore the data

## Observations: 67
## Variables: 7
## $ id      <int> 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19, 2…
## $ growth  <dbl> 0.0254, -0.0254, 0.0773, 0.2583, 0.0709, 0.0247, 0.1059, 0.03…
## $ base    <dbl> 6.157, 5.900, 5.896, 5.315, 5.923, 6.198, 6.075, 6.173, 6.150…
## $ T       <dbl> 3.585, 2.896, 2.763, 3.140, 2.785, 4.118, 3.296, 3.163, 2.740…
## $ E       <dbl> 5.216, 3.458, 4.995, 3.478, 4.805, 5.492, 4.852, 5.131, 5.146…
## $ G       <dbl> 6.192, 6.048, 5.950, 5.354, 5.940, 6.200, 6.113, 6.219, 6.155…
## $ Coastal <int> 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0…

4.1.1.1 Definitions of variables

  • growth: growth rate of per capita real income 1987-2001
  • base: lograrithm of the per apita income in the base year 1987
  • T: average terrorism index
  • E: average years of schooling
  • G: real per capita government expenditures in 1987
  • Coastal: dummy variable which takes the value of one if the province is a coastal province.

4.2 Spatial data

4.2.1 Explore the data

## Observations: 67
## Variables: 21
## $ ObjectID   <int> 1946, 1949, 1952, 1957, 2116, 2150, 2186, 2236, 2278, 2371…
## $ NAME       <chr> "Adana", "Adiyaman", "Afyon", "Agri", "Amasya", "Antalya",…
## $ COUNTRY    <chr> "Turkey", "Turkey", "Turkey", "Turkey", "Turkey", "Turkey"…
## $ ISO_CODE   <chr> "TR01", "TR02", "TR03", "TR04", "TR05", "TR07", "TR08", "T…
## $ ISO_CC     <chr> "TR", "TR", "TR", "TR", "TR", "TR", "TR", "TR", "TR", "TR"…
## $ ISO_SUB    <chr> "01", "02", "03", "04", "05", "07", "08", "09", "10", "11"…
## $ ADMINTYPE  <chr> "Province", "Province", "Province", "Province", "Province"…
## $ DISPUTED   <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
## $ NOTES      <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
## $ AUTONOMOUS <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
## $ COUNTRYAFF <chr> "Turkey", "Turkey", "Turkey", "Turkey", "Turkey", "Turkey"…
## $ CONTINENT  <chr> "Asia", "Asia", "Asia", "Asia", "Asia", "Asia", "Asia", "A…
## $ Land_Type  <chr> "Primary land", "Primary land", "Primary land", "Primary l…
## $ Land_Rank  <int> 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5…
## $ Shape_Leng <dbl> 8.589, 5.355, 6.698, 6.553, 4.831, 10.889, 4.740, 6.039, 9…
## $ Shape_Area <dbl> 1.6029, 0.8622, 1.4795, 1.1537, 0.6232, 2.1533, 0.7467, 0.…
## $ idnum      <int> 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19…
## $ province   <chr> "Adana", "Adiyaman", "Afyon", "Agri", "Amasya", "Antalya",…
## $ id         <dbl> 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19…
## $ name_esri  <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
## $ geometry   <POLYGON [°]> POLYGON ((36.44 38.22, 36.4..., POLYGON ((39.15 38…
  • Check the Coordinate Reference System
## Coordinate Reference System:
##   EPSG: 4326 
##   proj4string: "+proj=longlat +datum=WGS84 +no_defs"

5 Transform the data

No need to transform any data because both datasets share a common variable id

6 Merge the data

6.1 Keep data as sf object

  • Keep the data as sf class, so we will not lose the coodinate system
## Coordinate Reference System:
##   EPSG: 4326 
##   proj4string: "+proj=longlat +datum=WGS84 +no_defs"
## Observations: 67
## Variables: 27
## $ id         <dbl> 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19…
## $ growth     <dbl> 0.0254, -0.0254, 0.0773, 0.2583, 0.0709, 0.0247, 0.1059, 0…
## $ base       <dbl> 6.157, 5.900, 5.896, 5.315, 5.923, 6.198, 6.075, 6.173, 6.…
## $ T          <dbl> 3.585, 2.896, 2.763, 3.140, 2.785, 4.118, 3.296, 3.163, 2.…
## $ E          <dbl> 5.216, 3.458, 4.995, 3.478, 4.805, 5.492, 4.852, 5.131, 5.…
## $ G          <dbl> 6.192, 6.048, 5.950, 5.354, 5.940, 6.200, 6.113, 6.219, 6.…
## $ Coastal    <int> 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0…
## $ ObjectID   <int> 1946, 1949, 1952, 1957, 2116, 2150, 2186, 2236, 2278, 2371…
## $ NAME       <chr> "Adana", "Adiyaman", "Afyon", "Agri", "Amasya", "Antalya",…
## $ COUNTRY    <chr> "Turkey", "Turkey", "Turkey", "Turkey", "Turkey", "Turkey"…
## $ ISO_CODE   <chr> "TR01", "TR02", "TR03", "TR04", "TR05", "TR07", "TR08", "T…
## $ ISO_CC     <chr> "TR", "TR", "TR", "TR", "TR", "TR", "TR", "TR", "TR", "TR"…
## $ ISO_SUB    <chr> "01", "02", "03", "04", "05", "07", "08", "09", "10", "11"…
## $ ADMINTYPE  <chr> "Province", "Province", "Province", "Province", "Province"…
## $ DISPUTED   <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
## $ NOTES      <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
## $ AUTONOMOUS <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
## $ COUNTRYAFF <chr> "Turkey", "Turkey", "Turkey", "Turkey", "Turkey", "Turkey"…
## $ CONTINENT  <chr> "Asia", "Asia", "Asia", "Asia", "Asia", "Asia", "Asia", "A…
## $ Land_Type  <chr> "Primary land", "Primary land", "Primary land", "Primary l…
## $ Land_Rank  <int> 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5…
## $ Shape_Leng <dbl> 8.589, 5.355, 6.698, 6.553, 4.831, 10.889, 4.740, 6.039, 9…
## $ Shape_Area <dbl> 1.6029, 0.8622, 1.4795, 1.1537, 0.6232, 2.1533, 0.7467, 0.…
## $ idnum      <int> 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19…
## $ province   <chr> "Adana", "Adiyaman", "Afyon", "Agri", "Amasya", "Antalya",…
## $ name_esri  <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
## $ geometry   <POLYGON [°]> POLYGON ((36.44 38.22, 36.4..., POLYGON ((39.15 38…

7 Plot Thematic Maps

7.1 Quick Map

  • A quick map of the Terrorism variable

7.9 Set color intervals

Enter “style =” followed by one of the options below.

  • equal: divides the range of the variable into n parts.
  • pretty: chooses a number of breaks to fit a sequence of equality spaced ‘round’ values.
  • quantile: equal number of cases in each group
  • jenks: looks for natural breaks in the data
  • cat: when the variable is categorical

Change the number of intervals in the color scheme and how the intervals are spaced. Changing the number of intervals n = 7. So, we have 7 shades instead of the default 5.

7.11 Add borders

You can edit the borders of the shapefile with the tm_borders() function which has many arguments. alpha denotes the level of transparency on a scale from 0 to 1 where 0 is completely transparent.

7.14 Interactive map

## tmap mode set to interactive viewing
## tmap mode set to plotting

Documentation

8 Save a new shapefile

10 Datasets

END

LS0tCnRpdGxlOiAiTWFraW5nIG1hcHMgaW4gUjoiCnN1YnRpdGxlOiAiVXNpbmcgdGhlIHNmIGFuZCB0bWFwIFBhY2thZ2VzIgphdXRob3I6ICJDYXJsb3MgTWVuZGV6IgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgIGRmX3ByaW50OiBwYWdlZAogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6CiAgICAgIGNvbGxhcHNlZDogZmFsc2UKICAgICAgc21vb3RoX3Njcm9sbDogZmFsc2UKICAgIHRvY19kZXB0aDogNAogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlCiAgICBjb2RlX2ZvbGRpbmc6ICJzaG93IgogICAgdGhlbWU6ICJjb3NtbyIKICAgIGhpZ2hsaWdodDogIm1vbm9jaHJvbWUiCiAgaHRtbF9ub3RlYm9vazoKICAgIGNvZGVfZm9sZGluZzogc2hvdwogICAgaGlnaGxpZ2h0OiBtb25vY2hyb21lCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcwogICAgdGhlbWU6IGNvc21vCiAgICB0b2M6IHllcwogICAgdG9jX2RlcHRoOiA0CiAgICB0b2NfZmxvYXQ6CiAgICAgIGNvbGxhcHNlZDogbm8KICAgICAgc21vb3RoX3Njcm9sbDogbm8KICBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQKICB3b3JkX2RvY3VtZW50OiBkZWZhdWx0CmJpYmxpb2dyYXBoeTogYmlibGlvLmJpYgotLS0KCgo8c3R5bGU+CmgxLnRpdGxlIHtmb250LXNpemU6IDE4cHQ7IGNvbG9yOiBEYXJrQmx1ZTt9IApib2R5LCBoMSwgaDIsIGgzLCBoNCB7Zm9udC1mYW1pbHk6ICJQYWxhdGlubyIsIHNlcmlmO30KYm9keSB7Zm9udC1zaXplOiAxMnB0O30KLyogSGVhZGVycyAqLwpoMSxoMixoMyxoNCxoNSxoNntmb250LXNpemU6IDE0cHQ7IGNvbG9yOiAjMDAwMDhCO30KYm9keSB7Y29sb3I6ICMzMzMzMzM7fQphLCBhOmhvdmVyIHtjb2xvcjogIzhCM0E2Mjt9CnByZSB7Zm9udC1zaXplOiAxMnB4O30KPC9zdHlsZT4KCgpTdWdnZXN0ZWQgQ2l0YXRpb246IAoKPiBNZW5kZXogQy4gKDIwMjApLiAgTWFraW5nIG1hcHMgaW4gUjogVXNpbmcgdGhlIHNmIGFuZCB0bWFwIFBhY2thZ2VzLiBSIFN0dWRpby9SUHVicy4gQXZhaWxhYmxlIGF0IDxodHRwczovL3JwdWJzLmNvbS9xdWFyY3MtbGFiL3R1dG9yaWFsLW1hcHMtaW4tcj4KClRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbi1TaGFyZSBBbGlrZSA0LjAgSW50ZXJuYXRpb25hbCBMaWNlbnNlLiAKIVtdKExpY2Vuc2UucG5nKQoKCiMgTGlicmFyaWVzCgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsIHdhcm5pbmc9RkFMU0UpCgpsaWJyYXJ5KHRpZHl2ZXJzZSkgICMgTW9kZXJuIGRhdGEgc2NpZW5jZSB3b3JrZmxvdwpsaWJyYXJ5KHNmKSAgICAgICAgICMgU2ltcGxlIGZlYXR1cmVzIGZvciBSCmxpYnJhcnkodG1hcCkgICAgICAgIyBUaGVtYXRpYyBNYXBzCmxpYnJhcnkodG1hcHRvb2xzKSAgIyBUaGVtYXRpYyBNYXBzIFRvb2xzCmxpYnJhcnkoUkNvbG9yQnJld2VyKSAjIENvbG9yQnJld2VyIFBhbGV0dGVzCmxpYnJhcnkobGVhZmxldCkgICAgIyBJbnRlcmFjdGl2ZSB3ZWIgbWFwcwpsaWJyYXJ5KHJnZGFsKSAgICAgICMgQmluZGluZ3MgZm9yIHRoZSBHZW9zcGF0aWFsIERhdGEgQWJzdHJhY3Rpb24gTGlicmFyeQpsaWJyYXJ5KHJnZW9zKSAgICAgICMgSW50ZXJmYWNlIHRvIEdlb21ldHJ5IEVuZ2luZSAtIE9wZW4gU291cmNlIAoKCiMgQ2hhbmdlIHRoZSBwcmVzZW50YXRpb24gb2YgZGVjaW1hbCBudW1iZXJzIHRvIDQgYW5kIGF2b2lkIHNjaWVudGlmaWMgbm90YXRpb24Kb3B0aW9ucyhwcm9tcHQ9IlI+ICIsIGRpZ2l0cz00LCBzY2lwZW49OTk5KQpgYGAKCiMgVHV0b3JpYWwgb2JqZWN0aXZlcwoKLSBMb2FkIHNwYXRpYWwgZGF0YSBmaWxlcyBpbnRvIFIgCi0gSm9pbiBub24tc3BhaXRhbCBkYXRhIHRvIHNwYXRpYWwgZGF0YSBmaWxlcwotIENyZWF0ZSBzaW1wbGUgY2hvcm9wbGV0aCBtYXBzCgoKIyBPcmdpbmFsIGRhdGEgc291cmNlcwoKVGhlIG5vbi1zcGF0aWFsIGRhdGFmaWxlIGlzIGZyb206IAoKLSDDlmNhbCwgTi4sICYgWWlsZGlyaW0sIEouICgyMDEwKS4gW1JlZ2lvbmFsIGVmZmVjdHMgb2YgdGVycm9yaXNtIG9uIGVjb25vbWljIGdyb3d0aCBpbiBUdXJrZXk6IEEgZ2VvZ3JhcGhpY2FsbHkgd2VpZ2h0ZWQgcmVncmVzc2lvbiBhcHByb2FjaC5dKGh0dHBzOi8vam91cm5hbHMuc2FnZXB1Yi5jb20vZG9pL2Ficy8xMC4xMTc3LzAwMjIzNDMzMTAzNjQ1NzYpIEpvdXJuYWwgb2YgUGVhY2UgUmVzZWFyY2gsIDQ3KDQpLCA0NzctNDg5LgoKVGhlIHNwYXRpYWwgKHNoYXBlZmlsZSkgaXMgZnJvbTogCgotIFtNYXR0aGV3IEMuIEluZ3JhbV0oaHR0cDovL21hdHRpbmdyYW0ubmV0LykKCgojIEltcG9ydCB0aGUgZGF0YQoKCiMjIE5vbi1zcGF0aWFsIGRhdGEKCmBgYHtyfQpkYXQgPC1yZWFkLmNzdigiREFUQVNFVC5jc3YiKQpgYGAKCiMjIyBFeHBsb3JlIHRoZSBkYXRhCgpgYGB7cn0KZ2xpbXBzZShkYXQpIApgYGAKCiMjIyMgRGVmaW5pdGlvbnMgb2YgdmFyaWFibGVzCgotIGdyb3d0aDogZ3Jvd3RoIHJhdGUgb2YgcGVyIGNhcGl0YSByZWFsIGluY29tZSAxOTg3LTIwMDEKLSBiYXNlOiBsb2dyYXJpdGhtIG9mIHRoZSBwZXIgYXBpdGEgaW5jb21lIGluIHRoZSBiYXNlIHllYXIgMTk4NwotIFQ6IGF2ZXJhZ2UgdGVycm9yaXNtIGluZGV4Ci0gRTogYXZlcmFnZSB5ZWFycyBvZiBzY2hvb2xpbmcKLSBHOiByZWFsIHBlciBjYXBpdGEgZ292ZXJubWVudCBleHBlbmRpdHVyZXMgaW4gMTk4NwotIENvYXN0YWw6IGR1bW15IHZhcmlhYmxlICB3aGljaCB0YWtlcyB0aGUgdmFsdWUgb2Ygb25lIGlmIHRoZSBwcm92aW5jZSBpcyBhIGNvYXN0YWwgcHJvdmluY2UuCgoKCiMjIFNwYXRpYWwgZGF0YQoKYGBge3J9Cm1hcERhdGEgPC0gcmVhZF9zZigiTUFQLnNocCIpCmBgYAoKIyMjIEV4cGxvcmUgdGhlIGRhdGEKCmBgYHtyfQpnbGltcHNlKG1hcERhdGEpCmBgYAoKLSBDaGVjayB0aGUgQ29vcmRpbmF0ZSBSZWZlcmVuY2UgU3lzdGVtCgpgYGB7cn0Kc3RfY3JzKG1hcERhdGEpCmBgYAoKCiMgVHJhbnNmb3JtIHRoZSBkYXRhCgpObyBuZWVkIHRvIHRyYW5zZm9ybSBhbnkgZGF0YSBiZWNhdXNlIGJvdGggZGF0YXNldHMgc2hhcmUgYSBjb21tb24gdmFyaWFibGUgYGlkYAoKCiMgTWVyZ2UgdGhlIGRhdGEKCgpgYGB7cn0KZGF0X21hcCA8LSBpbm5lcl9qb2luKAogIGRhdCwKICBtYXBEYXRhLAogIGJ5ID0gImlkIgopCmBgYAoKIyMgS2VlcCBkYXRhIGFzIHNmIG9iamVjdAoKLSBLZWVwIHRoZSBkYXRhIGFzIHNmIGNsYXNzLCBzbyB3ZSB3aWxsIG5vdCBsb3NlIHRoZSBjb29kaW5hdGUgc3lzdGVtCgpgYGB7cn0KZGF0X21hcCA8LSBzdF9hc19zZihkYXRfbWFwKQpzdF9jcnMobWFwRGF0YSkKYGBgCgpgYGB7cn0KZ2xpbXBzZShkYXRfbWFwKQpgYGAKCgoKIyBQbG90IFRoZW1hdGljIE1hcHMKCgojIyBRdWljayBNYXAgCgotIEEgcXVpY2sgbWFwIG9mIHRoZSBUZXJyb3Jpc20gdmFyaWFibGUKCmBgYHtyfQpxdG0oZGF0X21hcCwgZmlsbCA9ICJUIikKYGBgCgoKIyMgU2ltcGxlIE1hcAoKYGBge3J9CnRtX3NoYXBlKGRhdF9tYXApICsgdG1fZmlsbCgiVCIpIApgYGAKCgojIyBSZW1vdmUgZnJhbWUKCmBgYHtyfQp0bV9zaGFwZShkYXRfbWFwKSArIAogIHRtX2ZpbGwoIlQiKSArCiAgdG1fbGF5b3V0KGZyYW1lID0gRkFMU0UpCmBgYAoKCiMjIFNldCBsZWdlbmQgb3V0c2lkZQoKYGBge3J9CnRtX3NoYXBlKGRhdF9tYXApICsgdG1fZmlsbCgiVCIpICsKICB0bV9sYXlvdXQobGVnZW5kLm91dHNpZGUgPSBUUlVFLCBmcmFtZSA9IEZBTFNFKQpgYGAKCiMjIFNldCBsZWdlbmQgc2l6ZQoKYGBge3J9CnRtX3NoYXBlKGRhdF9tYXApICsgdG1fZmlsbCgiVCIpICsKICB0bV9sYXlvdXQobGVnZW5kLm91dHNpZGUgPSBUUlVFLCBmcmFtZSA9IEZBTFNFKSArCiAgdG1fbGVnZW5kKHRleHQuc2l6ZSA9IDAuMykgCmBgYAoKCgojIyBTZXQgY29sb3IgcGFsZXR0ZQoKU2VlIGNvbG9yIHJlZmVyZW5jZSBbaGVyZV0oaHR0cHM6Ly93d3cuZGF0YW5vdmlhLmNvbS9lbi9ibG9nL3RoZS1hLXotb2YtcmNvbG9yYnJld2VyLXBhbGV0dGUvKQoKYGBge3J9CnRtX3NoYXBlKGRhdF9tYXApICsgCiAgdG1fZmlsbCgiVCIsIHBhbGV0dGUgPSAiR3JlZW5zIikgKwogIHRtX2xheW91dChsZWdlbmQub3V0c2lkZSA9IFRSVUUsIGZyYW1lID0gRkFMU0UpCmBgYAoKYGBge3J9CnRtX3NoYXBlKGRhdF9tYXApICsgCiAgdG1fZmlsbCgiVCIsIHBhbGV0dGUgPSAiLUdyZWVucyIpICsKICB0bV9sYXlvdXQobGVnZW5kLm91dHNpZGUgPSBUUlVFLCBmcmFtZSA9IEZBTFNFKQpgYGAKCgpgYGB7cn0KdG1fc2hhcGUoZGF0X21hcCkgKyAKICB0bV9maWxsKCJUIiwgcGFsZXR0ZSA9ICJ2aXJpZGlzIikgKwogIHRtX2xheW91dChsZWdlbmQub3V0c2lkZSA9IFRSVUUsIGZyYW1lID0gRkFMU0UpCmBgYAoKCiMjIEFkZCBwb2x5Z29uIG5hbWVzCgpgYGB7cn0KdG1fc2hhcGUoZGF0X21hcCkgKyAKICB0bV9maWxsKCJUIiwgcGFsZXR0ZSA9ICJ2aXJpZGlzIikgKwogIHRtX2xheW91dChsZWdlbmQub3V0c2lkZSA9IFRSVUUsIGZyYW1lID0gRkFMU0UpICsKICB0bV90ZXh0KCJwcm92aW5jZSIsIHNpemUgPSAiU2hhcGVfQXJlYSIsICBhdXRvLnBsYWNlbWVudCA9IEYsIGxlZ2VuZC5zaXplLnNob3cgPSBGQUxTRSkgCmBgYAoKCgpbRG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9yZHJyLmlvL2NyYW4vdG1hcC9tYW4vdG1fdGV4dC5odG1sKQoKIyMgQWRkIHNjYWxlIGJhcgoKYGBge3J9CnRtX3NoYXBlKGRhdF9tYXApICsgCiAgdG1fZmlsbCgiVCIsIHBhbGV0dGUgPSAidmlyaWRpcyIpICsKICB0bV9sYXlvdXQobGVnZW5kLm91dHNpZGUgPSBUUlVFLCBmcmFtZSA9IEZBTFNFKSArCiAgdG1fdGV4dCgicHJvdmluY2UiLCBzaXplID0gIlNoYXBlX0FyZWEiLCAgYXV0by5wbGFjZW1lbnQgPSBGLCBsZWdlbmQuc2l6ZS5zaG93ID0gRkFMU0UpICArIAogIHRtX3NjYWxlX2Jhcihwb3NpdGlvbiA9IGMoIlJJR0hUIiwgIkJPVFRPTSIpKQpgYGAKCgojIyBTZXQgY29sb3IgaW50ZXJ2YWxzCgpFbnRlciDigJxzdHlsZSA94oCdIGZvbGxvd2VkIGJ5IG9uZSBvZiB0aGUgb3B0aW9ucyBiZWxvdy4KCi0gZXF1YWw6IGRpdmlkZXMgdGhlIHJhbmdlIG9mIHRoZSB2YXJpYWJsZSBpbnRvIG4gcGFydHMuCi0gcHJldHR5OiBjaG9vc2VzIGEgbnVtYmVyIG9mIGJyZWFrcyB0byBmaXQgYSBzZXF1ZW5jZSBvZiBlcXVhbGl0eSBzcGFjZWQg4oCYcm91bmTigJkgdmFsdWVzLiAKLSBxdWFudGlsZTogZXF1YWwgbnVtYmVyIG9mIGNhc2VzIGluIGVhY2ggZ3JvdXAKLSBqZW5rczogbG9va3MgZm9yIG5hdHVyYWwgYnJlYWtzIGluIHRoZSBkYXRhCi0gY2F0OiB3aGVuIHRoZSB2YXJpYWJsZSBpcyBjYXRlZ29yaWNhbCAKCmBgYHtyfQp0bV9zaGFwZShkYXRfbWFwKSArIAogIHRtX2ZpbGwoIlQiLAogICAgICAgICAgc3R5bGUgPSAicXVhbnRpbGUiLAogICAgICAgICAgcGFsZXR0ZSA9ICJSZWRzIgogICAgKSArCiAgdG1fbGF5b3V0KAogICAgbGVnZW5kLm91dHNpZGUgPSBUUlVFLAogICAgZnJhbWUgPSBGQUxTRSkKYGBgCgpDaGFuZ2UgdGhlIG51bWJlciBvZiBpbnRlcnZhbHMgaW4gdGhlIGNvbG9yIHNjaGVtZSBhbmQgaG93IHRoZSBpbnRlcnZhbHMgYXJlIHNwYWNlZC4gQ2hhbmdpbmcgdGhlIG51bWJlciBvZiBpbnRlcnZhbHMgbiA9IDcuIFNvLCB3ZSBoYXZlIDcgc2hhZGVzIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgNS4KCmBgYHtyfQp0bV9zaGFwZShkYXRfbWFwKSArIAogIHRtX2ZpbGwoIlQiLAogICAgICAgICAgc3R5bGUgPSAicXVhbnRpbGUiLAogICAgICAgICAgbiA9IDcsCiAgICAgICAgICBwYWxldHRlID0gIlJlZHMiCiAgICApICsKICB0bV9sYXlvdXQoCiAgICBsZWdlbmQub3V0c2lkZSA9IFRSVUUsCiAgICBmcmFtZSA9IEZBTFNFKQpgYGAKCgoKIyMgQWRkIGhpc3RvZ3JhbQoKYGBge3J9CnRtX3NoYXBlKGRhdF9tYXApICsgCiAgdG1fZmlsbCgiVCIsCiAgICAgICAgICBzdHlsZSA9ICJxdWFudGlsZSIsCiAgICAgICAgICBuID0gNSwKICAgICAgICAgIHBhbGV0dGUgPSAiWWxPckJyIiwKICAgICAgICAgIGxlZ2VuZC5oaXN0ID0gVFJVRQogICAgKSArCiAgdG1fbGF5b3V0KAogICAgbGVnZW5kLm91dHNpZGUgPSBUUlVFLAogICAgZnJhbWUgPSBGQUxTRSkKYGBgCgoKIyMgQWRkIGJvcmRlcnMKCllvdSBjYW4gZWRpdCB0aGUgYm9yZGVycyBvZiB0aGUgc2hhcGVmaWxlIHdpdGggdGhlIHRtX2JvcmRlcnMoKSBmdW5jdGlvbiB3aGljaCBoYXMgbWFueSBhcmd1bWVudHMuIGFscGhhIGRlbm90ZXMgdGhlIGxldmVsIG9mIHRyYW5zcGFyZW5jeSBvbiBhIHNjYWxlIGZyb20gMCB0byAxIHdoZXJlIDAgaXMgY29tcGxldGVseSB0cmFuc3BhcmVudC4KCmBgYHtyfQp0bV9zaGFwZShkYXRfbWFwKSArIAogIHRtX2ZpbGwoIlQiLAogICAgICAgICAgc3R5bGUgPSAicXVhbnRpbGUiLAogICAgICAgICAgcGFsZXR0ZSA9ICJCbHVlcyIKICAgICkgKyAKICB0bV9ib3JkZXJzKGFscGhhPS40KSArCiAgdG1fbGF5b3V0KAogICAgbGVnZW5kLm91dHNpZGUgPSBUUlVFLAogICAgZnJhbWUgPSBGQUxTRSkKYGBgCgojIyBBZGQgY29tcGFzcwoKYGBge3J9CnRtX3NoYXBlKGRhdF9tYXApICsgCiAgdG1fZmlsbCgiVCIsCiAgICAgICAgICBzdHlsZSA9ICJxdWFudGlsZSIsCiAgICAgICAgICBwYWxldHRlID0gInZpcmlkaXMiCiAgICApICsgCiAgdG1fYm9yZGVycyhhbHBoYT0uNCkgKyAKICB0bV9jb21wYXNzKHR5cGUgPSAiOHN0YXIiLCAKICAgICAgICAgICAgICBwb3NpdGlvbiA9IGMoIlJJR0hUIiwgIkJPVFRPTSIpLAogICAgICAgICAgICAgIHNob3cubGFiZWxzID0gMiwKICAgICAgICAgICAgICB0ZXh0LnNpemUgPSAwLjM1KSArCiAgdG1fbGF5b3V0KGxlZ2VuZC5vdXRzaWRlID0gVFJVRSwKICAgICAgICAgICAgZnJhbWUgPSBGQUxTRSkKYGBgCgpbRG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly93d3cucmRvY3VtZW50YXRpb24ub3JnL3BhY2thZ2VzL3RtYXAvdmVyc2lvbnMvMi4zLTIvdG9waWNzL3RtX2NvbXBhc3MpCgoKIyMgRWRpdCB0aGUgbGF5b3V0CgpgYGB7cn0KdG1fc2hhcGUoZGF0X21hcCkgKyAKICB0bV9maWxsKCJUIiwKICAgICAgICAgIHBhbGV0dGUgPSAidmlyaWRpcyIsCiAgICAgICAgICBzdHlsZSA9ICJxdWFudGlsZSIsCiAgICAgICAgICB0aXRsZSA9ICJUZXJyb3Jpc3QgQXR0YWNrcyIKICAgICAgICAgICkgKyAKdG1fYm9yZGVycyhhbHBoYT0uNCkgKyAKdG1fbGF5b3V0KAogIGxlZ2VuZC50ZXh0LnNpemUgPSAwLjcsCiAgbGVnZW5kLnRpdGxlLnNpemUgPSAxLAogIGxlZ2VuZC5wb3NpdGlvbiA9IGMoInJpZ2h0IiwgImJvdHRvbSIpLAogIGxlZ2VuZC5vdXRzaWRlID0gVFJVRSwKICBmcmFtZSA9IEZBTFNFCiAgKSAKYGBgCgpbRG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly93d3cucmRvY3VtZW50YXRpb24ub3JnL3BhY2thZ2VzL3RtYXAvdmVyc2lvbnMvMi4zLTIvdG9waWNzL3RtX2xheW91dCkKCiMjIEludGVyYWN0aXZlIG1hcAoKCmBgYHtyfQp0bWFwX21vZGUoInZpZXciKQoKdG1fc2hhcGUoZGF0X21hcCkgKyAKICB0bV9maWxsKCJUIiwKICAgICAgICAgIHBhbGV0dGUgPSAidmlyaWRpcyIsCiAgICAgICAgICBpZD0icHJvdmluY2UiLAogICAgICAgICAgcG9wdXAudmFycz1jKCJUIiwgImdyb3d0aCIsICJiYXNlIiwgIkUiLCAiRyIpCiAgICAgICAgICApICsgCgl0bV9sZWdlbmQob3V0c2lkZT1UUlVFKSArCiAgdG1fbGF5b3V0KGZyYW1lID0gRkFMU0UpIAoKdG1hcF9tb2RlKCJwbG90IikKYGBgCgoKW0RvY3VtZW50YXRpb25dKGh0dHBzOi8vcmRyci5pby9jcmFuL3RtYXAvbWFuL3RtX3ZpZXcuaHRtbCkKCiMgU2F2ZSBhIG5ldyBzaGFwZWZpbGUKCmBgYHtyIGV2YWw9RkFMU0V9CnN0X3dyaXRlKGRhdF9tYXAsICJkYXRfbWFwLnNocCIpCmBgYAoKCgojIFJlZmVyZW5jZXMKCi0gPGh0dHBzOi8vcmRyci5pby9jcmFuL3RtYXAvPgoKLSBbVGVubmVrZXMsIE0uLCAyMDE4LCB0bWFwOiBUaGVtYXRpYyBNYXBzIGluIFIsIEpvdXJuYWwgb2YgU3RhdGlzdGljYWwgU29mdHdhcmUsIDg0KDYpLCAxLTM5XShodHRwczovL2RvaS5vcmcvMTAuMTg2MzcvanNzLnYwODQuaTA2KQoKLSA8aHR0cHM6Ly9tYXJjaW5zdGVwbmlhay5ldS9wb3N0L2ludGVyYWN0aXZlLWNob3JvcGxldGgtbWFwcy13aXRoLXItYW5kLXRtYXAtcGFydC1pLz4KCi0gW1ByYWN0aWNhbCA1OiBNYWtpbmcgbWFwcyBpbiBSXShodHRwczovL2RhdGEuY2RyYy5hYy51ay90dXRvcmlhbC9hYTU0OTFjOS1jYmFjLTQwMjYtOTdjOS1mOTE2ODQ2MmY0YWMvNzBjNGJjNjEtMDQ3NS00ODA2LTkyNDAtNGVmMWZhNjQ5YTA2KQoKLSBbTW9kZXJuIEdlb3NwYXRpYWwgRGF0YSBBbmFseXNpcyB3aXRoIFJdKGh0dHA6Ly9maWxlcy56ZXZyb3NzLmNvbS93b3Jrc2hvcHMvc3BhdGlhbC9zbGlkZXMvaHRtbC8wLWRlY2stbGlzdC5odG1sKQoKLSA8aHR0cHM6Ly90bG9ydXNzby5naXRodWIuaW8vZ2VvZGF0YV93b3Jrc2hvcC90bWFwX3BhY2thZ2U+CgotIDxodHRwczovL3JzdHVkaW8tcHVicy1zdGF0aWMuczMuYW1hem9uYXdzLmNvbS8yMjk0ODJfYjViMTgyZjY1MDQzNGEzNmFjZTRlZWVmMmQyYmNkODMuaHRtbCMxNz4KCi0gPGh0dHBzOi8vbXJhbi5taWNyb3NvZnQuY29tL3NuYXBzaG90LzIwMTctMTItMTEvd2ViL3BhY2thZ2VzL3RtYXAvdmlnbmV0dGVzL3RtYXAtbnV0c2hlbGwuaHRtbD4KCi0gW0NoYXB0ZXIgOCBTb2x1dGlvbnNdKGh0dHBzOi8vZ2VvY29tcHIuZ2l0aHViLmlvL2dlb2NvbXBrZy9hcnRpY2xlcy9zb2x1dGlvbnMwOC5odG1sKQoKLSBbR2VvY29tcHV0YXRpb24gd2l0aCBSIHdlYnNpdGVdKGh0dHBzOi8vZ2VvY29tcHIuZ2l0aHViLmlvLykKCi0gPGh0dHBzOi8vYm9va2Rvd24ub3JnL2xleGNvbWJlci9icnVuc2RvbmNvbWJlcjJlLz4KCgojIERhdGFzZXRzCgotIFtOb24tc3BhdGlhbF0oaHR0cHM6Ly9naXRodWIuY29tL3F1YXJjcy1sYWIvdHV0b3JpYWwtbWFwcy1pbi1yL2Jsb2IvbWFzdGVyL0RBVEFTRVQuemlwP3Jhdz10cnVlKQotIFtTcGF0aWFsXShodHRwczovL2dpdGh1Yi5jb20vcXVhcmNzLWxhYi90dXRvcmlhbC1tYXBzLWluLXIvYmxvYi9tYXN0ZXIvTUFQLnppcD9yYXc9dHJ1ZSkgCi0gW0NvbWJpbmVkXShodHRwczovL2dpdGh1Yi5jb20vcXVhcmNzLWxhYi90dXRvcmlhbC1tYXBzLWluLXIvYmxvYi9tYXN0ZXIvdHVya2V5X2FkbWluMV9tZXJnZTNfYWxsLnppcD9yYXc9dHJ1ZSkKCkVORAo=